package com.foreknow.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 动态代理的核心处理类：一定要实现InvocationHandler这个接口
 */
public class ProxyHandler implements InvocationHandler {
    //设置一个目标对象（DogImpl对象）
    Object target;

    //通过set方法给目标对象初始化
    public void setTarget(Object target) {
        this.target = target;
    }

    DogInterceptor interceptor = new DogInterceptor();

    //在代理实例上处理方法调用并返回结果。
    //proxy表示要调用方法所属的对象
    //method:要调用的目标方法
    //args:参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(method.getName().equals("info")) {
            interceptor.beginTransection(); //调用方法之前要执行的操作
            //调用目标对象(DogImpl)中的info方法
            method.invoke(target,args);
            interceptor.commitTransection(); //调用方法之后要执行的操作
        }else {
            method.invoke(target,args);
        }
        return null;
    }
}
